<?php
/**
 * contains class DateTime
 *
 * @copyright Copyright (C) 2003, 2004  Sebastian Mendel <info at sebastianmendel dot de>
 *
 * @license http://www.opensource.org/licenses/lgpl-license.php
 *          GNU Lesser General Public License  - LGPL
 *
 * @package phpDateTime
 * </pre>
 * 
 * @version 		1.0
 * @author Sebastian Mendel <info@sebastianmendel.de>
 * @version $Id: DateTime.class.php 118 2009-03-05 02:14:07Z sanglt $
 * @source $Source: /cvsroot/phpdatetime/phpDateTime/DateTime.class.php,v $
 *
 * @uses time.class.php
 * @uses date.class.php
 */

/**
 * required class-files
 */
require_once 'Time.class.php';
require_once 'Date.class.php';

/**
 * Class DateTime
 *
 * @copyright Copyright (C) 2003, 2004  Sebastian Mendel <info at sebastianmendel dot de>
 *
 * @license http://www.opensource.org/licenses/lgpl-license.php
 *          GNU Lesser General Public License  - LGPL
 *
 * @package phpDateTime
 * </pre>
 * 
 * @version 		1.0
 * @author Sebastian Mendel <info@sebastianmendel.de>
 * @uses Time
 * @uses Date
 */
class DateTime {
	/**
	 * @var object time, time Object of class Time
	 * @access protected
	 */
	var $time;
	
	/**
	 * @var object date, date Object of class Date
	 * @access protected
	 */
	var $date;
	
	/**
	 * DateTime
	 *
	 * @access protected
	 *
	 * @param string DateTime or Date in form [Date] [Time], e.g. YYYY-MM-DD HH:MM:SS
	 * @param string Time in form [Time], e.g. HH:MM:SS
	 *
	 * @uses split()
	 * @uses DateTime::setTime()
	 * @uses DateTime::setDate()
	 *
	 * @todo we should add the functionality to determine if given (first) string is time, date or datetime
	 *
	 */
	function DateTime($datetime = null, $time = null) {
		return $this->set ( $datetime, $time );
	}
	
	/**
	 * set
	 *
	 * @access public
	 * @param string DateTime or Date in form [Date] [Time], e.g. YYYY-MM-DD HH:MM:SS
	 * @param string Time in form [Time], e.g. HH:MM:SS
	 *
	 * @uses is_numeric()
	 * @uses split()
	 * @uses preg_match()
	 * @uses DateTime::setTime()
	 * @uses DateTime::setDate()
	 * @uses DateTime::get() as return value
	 * @return DateTime::get()
	 *
	 * @todo we should add the functionality to determine if given (first) string is time, date or datetime
	 *
	 */
	function set($datetime = null, $time = null) {
		if (null === $datetime) {
			$this->setTime ( 0 );
			$this->setDate ( 0 );
			return true;
		}
		
		if (is_numeric ( $datetime ) && $datetime > 0) {
			// wo do not support mysql-timestamp (YYYYMMDDHHIISS) any more
			$date = date ( 'Y-m-d', $datetime );
			$_time = date ( 'H:i:s', $datetime );
			
			if (null === $time) {
				$time = $_time;
			}
			
			$this->setTime ( $time );
			$this->setDate ( $date );
			return true;
		}
		
		if (is_a ( $datetime, 'DateTime' )) {
			$this->setTime ( $datetime->time );
			$this->setDate ( $datetime->date );
			return true;
		}
		
		// is it ISO-Format?
		// we expect any sort of '[Date] [Time]'
		if (null === $time) {
			$date_parts = split ( ' ', $datetime );
			$date = $date_parts [0];
			if (isset ( $date_parts [1] )) {
				$time = $date_parts [1];
			} else {
				$time = 0;
			}
		}
		
		// @todo add check for UK, US, DIN
		

		$this->setTime ( $time );
		$this->setDate ( $datetime );
		
		return $this->get ();
	}
	
	/**
	 * Sets Time Object
	 *
	 * @access public
	 * @param string|integer|object Time
	 *
	 * @uses DateTime::$time
	 * @uses Time
	 */
	function setTime($time = NULL) {
		$this->time = new Time ( $time );
	}
	
	/**
	 * Sets Date Object
	 *
	 * @access public
	 * @param string|integer|object Date
	 *
	 * @uses DateTime::$date
	 * @uses Date
	 */
	function setDate($date = NULL) {
		$this->date = new Date ( $date );
	}
	
	/**
	 * returns DateTime in standard format (ISO)
	 *
	 * @static
	 * @access public
	 * @uses Date::get()
	 * @uses Time::get()
	 * @uses DateTime::$date
	 * @uses DateTime::$time
	 *
	 * @return string concatenated Date::get() and Time::get()
	 */
	function get($datetime = NULL) {
		if (NULL === $datetime) {
			return $this->date->get () . ' ' . $this->time->get ();
		}
		
		$datetime = new DateTime ( $datetime );
		return $datetime->get ();
	}
	
	/**
	 * returns DateTime in DIN format
	 *
	 * @access public
	 * @uses Date::getAsDin()
	 * @uses Time::get()
	 * @uses DateTime::$date
	 * @uses DateTime::$time
	 *
	 * @return string concatenated Date::getAsdin() and Time::get()
	 */
	function getAsDin() {
		return $this->date->getAsDin () . ' ' . $this->time->get ();
	}
	
	/**
	 * returns UNIX-Timestamp (seconds since unix-epoche)
	 *
	 * @access public
	 * @uses Date::getAsTs()
	 * @uses Time::getAsSeconds()
	 * @uses DateTime::$date
	 * @uses DateTime::$time
	 *
	 * @return integer
	 */
	function getAsTs() {
		return $this->date->getAsTs () + $this->time->getAsSeconds ();
	}
}
?>